#ifndef CONTEXT_H
#define CONTEXT_H

#include "../global.h"
#include <any>
#include <vector>

namespace task
{
class ContextData;
/**
 * @brief:  任务组的构成原子任务之间传递数据的context
 * @author: sherlock_lht
 */
class Context final
{
public:
    explicit Context();
    ~Context();

    /**
     * @brief:  添加数据
     * @author: sherlock_lht
     */
    template<class T>
    void setData(const std::string &name, const T &value);

    /**
     * @brief:  获取数据，数据类型错误或者数据不存在，则返回default_data
     * @author: sherlock_lht
     */
    template<class T>
    T data(const std::string &name, const T &default_data = {}) const;

    /**
     * @brief:  获取数据，并将数据存入data中，数据类型错误或者不存在，则返回false，否则返回true
     * @author: sherlock_lht
     */
    template<class T>
    bool getData(const std::string &name, T &data) const;

    /**
     * @brief:  查看指定名称的数据是否存在
     * @author: sherlock_lht
     */
    [[nodiscard]] bool exist(const std::string &name) const;

    /**
     * @brief:  获取当前已存在的所有的数据的key
     * @author: sherlock_lht
     */
    [[nodiscard]] std::vector<std::string> getAllDataKey() const;

private:
    void setData(const std::string &name, std::any &value);
    [[nodiscard]] std::any getData(const std::string &name, bool *is_ok) const;

private:
    DECLARE_DATA(Context)
    friend class TaskChain;
};

}
#include "context.inl"
#endif //CONTEXT_H
